home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / GAMES / P_ROBO31 / BUBBA.PR < prev    next >
Text File  |  1989-10-30  |  16KB  |  279 lines

  1. (**************************************************************************)
  2. (*                             W A R N I N G                              *)
  3. (*                                                                        *)
  4. (*  This Robot has NOT been designed to take advantage of the advanced    *)
  5. (*  features of P-ROBOTS, such as, Shields, Fuel, Teams or Obstructions.  *)
  6. (**************************************************************************)
  7.  
  8.   PROCEDURE BUBBA;
  9.  
  10. {  A robot.  
  11.  
  12.    No, it is not the big brute the name implies.  Rather, this robot operates
  13.    under the belief the it is possible to use brains (or trig.) over braun (or
  14.    shear speed).
  15.  
  16.    The underlying design is that of a fast but somewhat inaccurate scanner
  17.    followed by an attempt at a single intelligent shot.  The net result is
  18.    a robot that will sometimes shoot way off target, but other times hammer
  19.    the opponent.  It is designed for only one opponent and would probably
  20.    fail miserably in the presence of a crowd.
  21.  
  22.    Its defense is based on the theory that moving robots are the hardest to
  23.    hit.  Therefore, it employs the longest runs possible by mainly sticking
  24.    to diagonals but occasionally switching from one diagonal to the other.
  25.    By the way, this robot, unlike most, hits moving targets more accurately
  26.    than stationary targets.
  27.  
  28.    All in all, Bubba is a huge compromise, for the environment in which Bubba
  29.    exists imposes many restrictions which don't allow a purely intelligent robot
  30.    to function.
  31.  
  32.    How to beat Bubba ???  
  33.  
  34.    A good question, but I'll tell.  Bubba is most effective against robots
  35.    that choose (or stumble into) the same path (including the opposite
  36.    direction) that Bubba has laid claim to.  (The trig. functions are vastly
  37.    simplified in these cases ... no guess work is involved).  So, traveling
  38.    on non-common angles is a good idea.  Also, since Bubba is slow, if you can
  39.    sneak up on him and then repeatedly blast him at close range, he will 
  40.    probably sustain more damage than he returns.  But, be careful sneaking up
  41.    or running away ... Bubba's intelligence will win out if your located.
  42.  
  43.    All in all, Bubba may not be the smartest or fastest.  But Bubba is tough.
  44.  
  45.  
  46.    W. Baird    12/89
  47. }
  48.  
  49.   VAR
  50.     s_dir : Integer;              { scan direction }
  51.     s_dist : Integer;             { scanned distance }
  52.     old_s_dist : Integer;         { previous scanned distance }
  53.  
  54.     PROCEDURE robot(r_dir, turn_time : Integer);
  55.     BEGIN
  56.       REPEAT
  57.         DRIVE(r_dir, 100);
  58.         s_dist := SCAN(s_dir, 10); 
  59.         IF s_dist > 25 THEN
  60.           IF s_dist > old_s_dist THEN { constant scan angle }
  61.             CASE (s_dir-r_dir) MOD 360 DIV 12 OF
  62.               {348..11} 0, 29 : CANNON(s_dir, s_dist+s_dist DIV 6); { --> --> }
  63.               {12..35} 1, 2 : CANNON(s_dir, s_dist+s_dist DIV 7);
  64.               {36..59} 3, 4 : CANNON(s_dir+3, s_dist+10+s_dist DIV 7);
  65.               {60..83} 5, 6 : CANNON(s_dir+5, s_dist+20+s_dist DIV 6);
  66.               {84..95} 7 : CANNON(s_dir+6, s_dist+26+s_dist DIV 6);
  67.               {96..119} 8, 9 : CANNON(s_dir+4, s_dist+40+s_dist DIV 6);
  68.               {120..143} 10, 11 : CANNON(s_dir+3, s_dist+58+s_dist DIV 6);
  69.               {144..167} 12, 13 : CANNON(s_dir+2, s_dist+61+s_dist DIV 6);
  70.               {168..191} 14, 15 : CANNON(s_dir, s_dist+72+s_dist DIV 5); { <-- --> }
  71.               {192..215} 16, 17 : CANNON(s_dir-2, s_dist+62+s_dist DIV 6);
  72.               {216..239} 18, 19 : CANNON(s_dir-3, s_dist+50+s_dist DIV 6);
  73.               {240..263} 20, 21 : CANNON(s_dir-5, s_dist+40+s_dist DIV 6);
  74.               {264..275} 22 : CANNON(s_dir-10, s_dist+30+s_dist DIV 6);
  75.               {276..299} 23, 24 : CANNON(s_dir-9, s_dist+28+s_dist DIV 6);
  76.               {300..323} 25, 26 : CANNON(s_dir-9, s_dist+12+s_dist DIV 7);
  77.               {324..347} 27, 28 : CANNON(s_dir-8, s_dist+s_dist DIV 7);
  78.             END                   {case .. s_dir > old_sdir}
  79.           ELSE
  80.             CASE (s_dir-r_dir) MOD 360 DIV 12 OF
  81.               {348..11} 0, 29 : IF s_dist > 123 THEN CANNON(s_dir, s_dist-75-s_dist DIV 10); { --> <-- }
  82.               {12..35} 1, 2 : IF s_dist > 95 THEN CANNON(s_dir, s_dist-60-s_dist DIV 11);
  83.               {36..59} 3, 4 : IF s_dist > 70 THEN CANNON(s_dir+3, s_dist-44-s_dist DIV 11);
  84.               {60..83} 5, 6 : IF s_dist > 60 THEN CANNON(s_dir+5, s_dist-38-s_dist DIV 11);
  85.               {84..95} 7 : IF s_dist > 50 THEN CANNON(s_dir+6, s_dist-28-s_dist DIV 11);
  86.               {96..119} 8, 9 : IF s_dist > 40 THEN CANNON(s_dir+5, s_dist-20-s_dist DIV 11);
  87.               {120..143} 10, 11 : CANNON(s_dir+3, s_dist-8-s_dist DIV 10);
  88.               {144..167} 12, 13 : CANNON(s_dir+2, s_dist-s_dist DIV 9);
  89.               {168..191} 14, 15 : CANNON(s_dir, s_dist-s_dist DIV 8); { <-- <-- }
  90.               {192..215} 16, 17 : CANNON(s_dir-2, s_dist+5-s_dist DIV 8);
  91.               {216..239} 18, 19 : IF s_dist > 40 THEN CANNON(s_dir-3, s_dist-8-s_dist DIV 10);
  92.               {240..263} 20, 21 : IF s_dist > 45 THEN CANNON(s_dir-5, s_dist-16-s_dist DIV 10);
  93.               {264..275} 22 : IF s_dist > 50 THEN CANNON(s_dir-5, s_dist-28-s_dist DIV 10);
  94.               {276..299} 23, 24 : IF s_dist > 60 THEN CANNON(s_dir-4, s_dist-37-s_dist DIV 10);
  95.               {300..323} 25, 26 : IF s_dist > 77 THEN CANNON(s_dir-1, s_dist-48-s_dist DIV 10);
  96.               {324..347} 27, 28 : IF s_dist > 100 THEN CANNON(s_dir-2, s_dist-58-s_dist DIV 11);
  97.             END                   {case .. s_dir <= old_sdir}
  98.         ELSE                      {dist <= 25}
  99.           BEGIN
  100.             s_dir := s_dir-20;
  101.             IF SCAN(s_dir, 10) = 0 THEN
  102.               BEGIN
  103.                 s_dir := s_dir+40;
  104.                 IF SCAN(s_dir, 10) = 0 THEN
  105.                   BEGIN
  106.                     s_dir := s_dir-60;
  107.                     WHILE SCAN(s_dir, 10) = 0 DO
  108.                       s_dir := s_dir-20;
  109.                     s_dist := SCAN(s_dir, 10);
  110.                     CANNON(s_dir, s_dist); { forget intelligence here }
  111.                     CANNON(s_dir, s_dist);
  112.                   END
  113.                 ELSE
  114.                   BEGIN
  115.                     s_dist := SCAN(s_dir, 10);
  116.                     IF s_dist > old_s_dist THEN { constant scan angle }
  117.                       CASE (s_dir-r_dir) MOD 360 DIV 12 OF
  118.                         {348..11} 0, 29 : CANNON(s_dir+10, s_dist+s_dist DIV 6); { --> --> }
  119.                         {12..35} 1, 2 : CANNON(s_dir+10, s_dist+s_dist DIV 7);
  120.                         {36..59} 3, 4 : CANNON(s_dir+13, s_dist+10+s_dist DIV 7);
  121.                         {60..83} 5, 6 : CANNON(s_dir+15, s_dist+20+s_dist DIV 6);
  122.                         {84..95} 7 : CANNON(s_dir+16, s_dist+26+s_dist DIV 6);
  123.                         {96..119} 8, 9 : CANNON(s_dir+14, s_dist+40+s_dist DIV 6);
  124.                         {120..143} 10, 11 : CANNON(s_dir+13, s_dist+58+s_dist DIV 6);
  125.                         {144..167} 12, 13 : CANNON(s_dir+12, s_dist+61+s_dist DIV 6);
  126.                         {168..191} 14, 15 : CANNON(s_dir+10, s_dist+72+s_dist DIV 5); { <-- --> }
  127.                         {192..215} 16, 17 : CANNON(s_dir+08, s_dist+62+s_dist DIV 6);
  128.                         {216..239} 18, 19 : CANNON(s_dir+07, s_dist+50+s_dist DIV 6);
  129.                         {240..263} 20, 21 : CANNON(s_dir+05, s_dist+40+s_dist DIV 6);
  130.                         {264..275} 22 : CANNON(s_dir, s_dist+30+s_dist DIV 6);
  131.                         {276..299} 23, 24 : CANNON(s_dir+01, s_dist+28+s_dist DIV 6);
  132.                         {300..323} 25, 26 : CANNON(s_dir+01, s_dist+12+s_dist DIV 7);
  133.                         {324..347} 27, 28 : CANNON(s_dir+02, s_dist+s_dist DIV 7);
  134.                       END         {case .. s_dir > old_sdir}
  135.                     ELSE
  136.                       CASE (s_dir-r_dir) MOD 360 DIV 12 OF
  137.                         {348..11} 0, 29 : IF s_dist > 123 THEN CANNON(s_dir+10, s_dist-75-s_dist DIV 10); { --> <-- }
  138.                         {12..35} 1, 2 : IF s_dist > 95 THEN CANNON(s_dir+10, s_dist-60-s_dist DIV 11);
  139.                         {36..59} 3, 4 : IF s_dist > 70 THEN CANNON(s_dir+13, s_dist-44-s_dist DIV 11);
  140.                         {60..83} 5, 6 : IF s_dist > 60 THEN CANNON(s_dir+15, s_dist-38-s_dist DIV 11);
  141.                         {84..95} 7 : IF s_dist > 50 THEN CANNON(s_dir+16, s_dist-28-s_dist DIV 11);
  142.                         {96..119} 8, 9 : IF s_dist > 40 THEN CANNON(s_dir+15, s_dist-20-s_dist DIV 11);
  143.                         {120..143} 10, 11 : CANNON(s_dir+13, s_dist-8-s_dist DIV 10);
  144.                         {144..167} 12, 13 : CANNON(s_dir+12, s_dist-s_dist DIV 9);
  145.                         {168..191} 14, 15 : CANNON(s_dir+10, s_dist-s_dist DIV 8); { <-- <-- }
  146.                         {192..215} 16, 17 : CANNON(s_dir+08, s_dist+5-s_dist DIV 8);
  147.                         {216..239} 18, 19 : IF s_dist > 40 THEN CANNON(s_dir+07, s_dist-8-s_dist DIV 10);
  148.                         {240..263} 20, 21 : IF s_dist > 45 THEN CANNON(s_dir+05, s_dist-16-s_dist DIV 10);
  149.                         {264..275} 22 : IF s_dist > 50 THEN CANNON(s_dir+05, s_dist-28-s_dist DIV 10);
  150.                         {276..299} 23, 24 : IF s_dist > 60 THEN CANNON(s_dir+06, s_dist-37-s_dist DIV 10);
  151.                         {300..323} 25, 26 : IF s_dist > 77 THEN CANNON(s_dir+09, s_dist-48-s_dist DIV 10);
  152.                         {324..347} 27, 28 : IF s_dist > 100 THEN CANNON(s_dir+08, s_dist-58-s_dist DIV 11);
  153.                       END         {case .. s_dir <= old_sdir}
  154.                   END
  155.               END
  156.             ELSE
  157.               BEGIN
  158.                 s_dist := SCAN(s_dir, 10);
  159.                 IF s_dist > old_s_dist THEN { constant scan angle }
  160.                   CASE (s_dir-r_dir) MOD 360 DIV 12 OF
  161.                     {348..11} 0, 29 : CANNON(s_dir-10, s_dist+s_dist DIV 6); { --> --> }
  162.                     {12..35} 1, 2 : CANNON(s_dir-10, s_dist+s_dist DIV 7);
  163.                     {36..59} 3, 4 : CANNON(s_dir-7, s_dist+10+s_dist DIV 7);
  164.                     {60..83} 5, 6 : CANNON(s_dir-5, s_dist+20+s_dist DIV 6);
  165.                     {84..95} 7 : CANNON(s_dir-4, s_dist+26+s_dist DIV 6);
  166.                     {96..119} 8, 9 : CANNON(s_dir-7, s_dist+40+s_dist DIV 6);
  167.                     {120..143} 10, 11 : CANNON(s_dir-7, s_dist+58+s_dist DIV 6);
  168.                     {144..167} 12, 13 : CANNON(s_dir-8, s_dist+61+s_dist DIV 6);
  169.                     {168..191} 14, 15 : CANNON(s_dir-10, s_dist+72+s_dist DIV 5); { <-- --> }
  170.                     {192..215} 16, 17 : CANNON(s_dir-12, s_dist+62+s_dist DIV 6);
  171.                     {216..239} 18, 19 : CANNON(s_dir-13, s_dist+50+s_dist DIV 6);
  172.                     {240..263} 20, 21 : CANNON(s_dir-15, s_dist+40+s_dist DIV 6);
  173.                     {264..275} 22 : CANNON(s_dir-20, s_dist+30+s_dist DIV 6);
  174.                     {276..299} 23, 24 : CANNON(s_dir-19, s_dist+28+s_dist DIV 6);
  175.                     {300..323} 25, 26 : CANNON(s_dir-19, s_dist+12+s_dist DIV 7);
  176.                     {324..347} 27, 28 : CANNON(s_dir-18, s_dist+s_dist DIV 7);
  177.                   END             {case .. s_dir > old_sdir}
  178.                 ELSE
  179.                   CASE (s_dir-r_dir) MOD 360 DIV 12 OF
  180.                     {348..11} 0, 29 : IF s_dist > 123 THEN CANNON(s_dir-10, s_dist-75-s_dist DIV 10); { --> <-- }
  181.                     {12..35} 1, 2 : IF s_dist > 95 THEN CANNON(s_dir-10, s_dist-60-s_dist DIV 11);
  182.                     {36..59} 3, 4 : IF s_dist > 70 THEN CANNON(s_dir-7, s_dist-44-s_dist DIV 11);
  183.                     {60..83} 5, 6 : IF s_dist > 60 THEN CANNON(s_dir-5, s_dist-38-s_dist DIV 11);
  184.                     {84..95} 7 : IF s_dist > 50 THEN CANNON(s_dir-4, s_dist-28-s_dist DIV 11);
  185.                     {96..119} 8, 9 : IF s_dist > 40 THEN CANNON(s_dir-5, s_dist-20-s_dist DIV 11);
  186.                     {120..143} 10, 11 : CANNON(s_dir-7, s_dist-8-s_dist DIV 10);
  187.                     {144..167} 12, 13 : CANNON(s_dir-8, s_dist-s_dist DIV 9);
  188.                     {168..191} 14, 15 : CANNON(s_dir-10, s_dist-s_dist DIV 8); { <-- <-- }
  189.                     {192..215} 16, 17 : CANNON(s_dir-8, s_dist+5-s_dist DIV 8);
  190.                     {216..239} 18, 19 : IF s_dist > 40 THEN CANNON(s_dir-7, s_dist-8-s_dist DIV 10);
  191.                     {240..263} 20, 21 : IF s_dist > 45 THEN CANNON(s_dir-5, s_dist-16-s_dist DIV 10);
  192.                     {264..275} 22 : IF s_dist > 50 THEN CANNON(s_dir-5, s_dist-28-s_dist DIV 10);
  193.                     {276..299} 23, 24 : IF s_dist > 60 THEN CANNON(s_dir-6, s_dist-37-s_dist DIV 10);
  194.                     {300..323} 25, 26 : IF s_dist > 77 THEN CANNON(s_dir-9, s_dist-48-s_dist DIV 10);
  195.                     {324..347} 27, 28 : IF s_dist > 100 THEN CANNON(s_dir-8, s_dist-58-s_dist DIV 11);
  196.                   END             {case .. s_dir <= old_sdir}
  197.               END;
  198.           END;
  199.         old_s_dist := s_dist;
  200.       UNTIL time >= turn_time;
  201.       DRIVE(r_dir, 40);
  202.       WHILE speed > 50 DO
  203.         BEGIN
  204.           s_dist := SCAN(s_dir, 10);
  205.           IF s_dist > 39 THEN
  206.             BEGIN                 { no time to be intelligent }
  207.               CANNON(s_dir, s_dist);
  208.               CANNON(s_dir, s_dist);
  209.             END
  210.           ELSE
  211.             BEGIN
  212.               s_dir := s_dir-20;
  213.               IF SCAN(s_dir, 10) = 0 THEN
  214.                 BEGIN
  215.                   s_dir := s_dir+40;
  216.                   IF SCAN(s_dir, 10) = 0 THEN
  217.                     BEGIN
  218.                       s_dir := s_dir-60;
  219.                       WHILE SCAN(s_dir, 10) = 0 DO
  220.                         s_dir := s_dir-20;
  221.                     END;
  222.                 END;
  223.               s_dist := SCAN(s_dir, 10);
  224.               CANNON(s_dir, s_dist);
  225.               CANNON(s_dir, s_dist);
  226.             END;
  227.           old_s_dist := s_dist;
  228.         END;
  229.     END;                          {robot}
  230.  
  231.   BEGIN
  232.     IF loc_y < 500 THEN
  233.       BEGIN
  234.         s_dir := 14515;           {115}
  235.         robot(Angle_To(100, 900), { n-w }
  236.               time+distance(loc_x, loc_y, 225, 775) DIV 4);
  237.         robot(Angle_To(900, 100), { s-e }
  238.               time+distance(loc_x, loc_y, 775, 225) DIV 4);
  239.       END
  240.     ELSE
  241.       BEGIN
  242.         s_dir := 14735;           {335}
  243.         robot(Angle_To(900, 100), { s-e }
  244.               time+distance(loc_x, loc_y, 775, 225) DIV 4);
  245.       END;
  246.  
  247.     REPEAT
  248.       robot(Angle_To(100, 900),   { n-w }
  249.             time+distance(loc_x, loc_y, 200, 800) DIV 4);
  250.       robot(Angle_To(900, 100),   { s-e }
  251.             time+distance(loc_x, loc_y, 820, 180) DIV 4);
  252.       robot(135,                  { n-w }
  253.             time+distance(loc_x, loc_y, 180, 820) DIV 4);
  254.       robot(315,                  { s-e }
  255.             time+distance(loc_x, loc_y, 820, 180) DIV 4);
  256.  
  257.       robot(Angle_To(500, 900),   { n-nw }
  258.             time+distance(loc_x, loc_y, 530, 800) DIV 4);
  259.       robot(Angle_To(100, 100),   { s-sw }
  260.             time+distance(loc_x, loc_y, 180, 180) DIV 4);
  261.       s_dir := s_dir+10;
  262.  
  263.       robot(Angle_To(900, 900),   { n-e }
  264.             time+distance(loc_x, loc_y, 800, 800) DIV 4);
  265.       robot(Angle_To(100, 100),   { s-w }
  266.             time+distance(loc_x, loc_y, 180, 180) DIV 4);
  267.       robot(45,                   { n-e }
  268.             time+distance(loc_x, loc_y, 800, 800) DIV 4);
  269.       robot(225,                  { s-w }
  270.             time+distance(loc_x, loc_y, 180, 180) DIV 4);
  271.  
  272.       robot(Angle_To(500, 900),   { n-ne }
  273.             time+distance(loc_x, loc_y, 470, 820) DIV 4);
  274.       robot(Angle_To(900, 100),   { s-se }
  275.             time+distance(loc_x, loc_y, 820, 180) DIV 4);
  276.       s_dir := s_dir+10;
  277.     UNTIL DEAD;
  278.   END;
  279.